package com.theorydance.esoperator.utils;

import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

/**
 * 针对ak/sk进行验证的工具
 * @Author grand_ranfs
 * @Date 2023/11/16 10:43
 */
public class SignUtilClient {

    /**
     * 通过请求参数，包装请求header信息（含签名信息）（客户端用）
     * @param appId ak 用于标示用户
     * @param appSecret sk 是用户用于认证字符串和用来验证认证字符串的密钥，其中SK必须保密
     * @param reqParam 请求参数键值对集合
     * @return {appId=000000, sign=B562FFD6FC691A42CD7F46D068B3F74A, nonce=d50e301d-ee2c-446e-8f28-013f0fee09fb, ts=1623388123195}
     */
    public static Map<String, Object> wrapperHeader(String appId, String appSecret, Map<String, Object> reqParam) {
        // 生成13位的时间戳
        Long ts = System.currentTimeMillis();
        String nonce = UUID.randomUUID().toString().replace("-", "");
        Map<String, Object> header = new HashMap<>();
        // 进行接口调用时的时间戳，即当前时间戳（毫秒），服务端会校验时间戳，例如时间差超过20分钟则认为请求无效，防止重复请求的攻击
        header.put("ts", ts);
        // 每个请求提供一个唯一的标识符，服务器能够防止请求被多次使用
        header.put("nonce", nonce);
        // 用于标识哪个三方系统发来的请求
        header.put("appId", appId);
        // 按签名算法获取sign
        String sign = SignUtilCore.getSign(appId, appSecret, ts, nonce, reqParam);
        header.put("sign", sign);
        return header;
    }

}

